package com.wyt.common.file.video;


import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ws.schild.jave.*;

import java.io.File;

public class H264ToMp4Util {
    protected final static Logger log = LoggerFactory.getLogger(H264ToMp4Util.class);

    /**
     *
     * @param filePath 源文件路径
     */
    public static String h264ToMp4(String filePath) {
        if (StringUtils.isEmpty(filePath) || !filePath.endsWith("h264")) {
            return filePath;
        }
        try {
            File file = new File(filePath);
            String mp4FilePath = filePath.replace("h264", "mp4");
            File mpFile = new File(mp4FilePath);
            if (!mpFile.exists()) {
                mpFile.createNewFile();
            }
            //获取文件多媒体类
            MultimediaObject sourceFile = new MultimediaObject(file);

            VideoAttributes video = new VideoAttributes();
            AudioAttributes audio = new AudioAttributes();
            //音频编码器
            audio.setCodec("libmp3lame");
            //位速率又叫比特率，是指在单位时间内可以传输多少数据
            audio.setBitRate(new Integer(64000));
            //音频的通道数，一般来说 都是单通道和双通道（立体音）
            audio.setChannels(new Integer(1));
            //是指在数码音频和视频技术应用中，当进行模拟/数码转换时，每秒钟对模拟信号进行取样时的快慢次数
            audio.setSamplingRate(new Integer(22050));
            //视频编码器
            video.setCodec("libx264");
            //位速率又叫比特率，是指在单位时间内可以传输多少数据
            video.setBitRate(new Integer(800000));
            //画面桢速率
            video.setFrameRate(new Integer(20));
            video.setSize(new VideoSize(1920, 1080));
            EncodingAttributes attr = new EncodingAttributes();
            attr.setFormat("mp4");
            attr.setAudioAttributes(audio);
            attr.setVideoAttributes(video);
            Encoder encoder = new Encoder();
            encoder.encode(sourceFile, mpFile, attr);
            return mp4FilePath;
        } catch (Exception e) {
            log.error("h264视频转mp4异常:", e);
        }
        return filePath;
    }

    public static void main(String[] args) {
        H264ToMp4Util.h264ToMp4("D:/tmp-data/1709557127415.h264");
    }
}
